package com.kits.store.core

import android.content.Context
import android.os.Build
import androidx.annotation.RequiresApi
import java.io.File
import java.io.InputStream
import java.io.OutputStream


/**
 * 是否需要申明权限
 * 是否需要申请权限
 */
object InnerStorage {
    /**
     * 在内部存储空间/data/data/<applicationId>/files/ 中创建文件
     * @param context 上下文
     * @param dir 需要创建的文件夹 可以为空
     * @param file 需要创建的文件
     *
     */
    fun file(context: Context, dir: String?, file: String): File? {
        return Utils.createFile(context.filesDir.absolutePath, dir, file)
    }

    /**
     * 在内部存储空间/data/data/<applicationId>/cache/ 中创建文件
     * @param context 上下文
     * @param dir 需要创建的文件夹 可以为空
     * @param file 需要创建的文件
     *
     */
    fun cachesFile(context: Context, dir: String?, file: String): File? {
        return Utils.createFile(context.cacheDir.absolutePath, dir, file)
    }

    /**
     * 此位置最适合存储应用程序在运行时生成的编译或优化代码 非常少用到
     */
    fun codeCachesFile(context: Context, dir: String?, file: String): File? {
        return Utils.createFile(context.codeCacheDir.absolutePath, dir, file)
    }
    /**
     * 在外部存储空间/sdcard/Android/obb/<applicationId>/ 中创建文件
     * 一般是使用google play obb文件（APK 扩展文件）国内一般不使用
     * @param context 上下文
     * @param dir 需要创建的文件夹 可以为空
     * @param file 需要创建的文件
     * 这个接口有版本要求
     */
    fun obbDirFile(context: Context, dir: String?, file: String): File? {
        return Utils.createFile(context.obbDir.absolutePath, dir, file)
    }

    /**
     * 在内部存储空间/data/data/<applicationId>/ 中创建文件
     * @param context 上下文
     * @param dir 需要创建的文件夹 可以为空
     * @param file 需要创建的文件
     * 这个接口有版本要求
     */
    @RequiresApi(Build.VERSION_CODES.N)
    fun dataFile(context: Context, dir: String?, file: String): File? {
        return Utils.createFile(context.dataDir.absolutePath, dir, file)
    }
    /**
     * 在内部存储空间/data/data/<applicationId>/files/ 中创建文件
     * @param context 上下文
     * @param fullName 需要创建的文件
     * 注意通过这个接口创建的文件只能是再files文件下直接创建文件，不能创建更深一层的子目录
     */

    fun fileStreamPath(context: Context, fullName: String):File{
        return context.getFileStreamPath(fullName)
    }
    /**
     * 在内部存储空间/data/data/<applicationId>/files/ 中创建文件
     * @param context 上下文
     * @param fullName 需要创建的文件
     * 注意通过这个接口创建的文件只能是再files文件下直接创建文件，不能创建更深一层的子目录
     */

    fun inputFile(context: Context, fullName: String):InputStream{
        return context.openFileInput(fullName)
    }
    /**
     * 在内部存储空间/data/data/<applicationId>/files/ 中创建文件
     * @param context 上下文
     * @param fullName 需要创建的文件
     * @param mode 创建文件的权限
     * 注意
     * 1. 通过这个接口创建的文件只能是再files文件下直接创建文件，不能创建更深一层的子目录
     * 2. API>=24 以后文件权限 只支持MODE_PRIVATE，MODE_APPEND。MODE_WORLD_READABLE，MODE_WORLD_WRITEABLE 直接抛出异常
     */

    fun outputFile(context: Context, fullName: String, mode: Int=Context.MODE_PRIVATE):OutputStream{
        return context.openFileOutput(fullName, mode)
    }

    /**
     * @param context 应用上下文
     * 返回/data/data/<applicationId>/files/ 下的直接子文件或者直接子文件夹
     */

    fun fileList(context: Context):Array<out String> {
        return context.fileList()
    }

    fun obbFileList(context: Context):Array<out File>{
        return context.obbDirs
    }
    /**
     * 其他目录
     * /data/data/<applicationId>/shared_prefs/  用于存储SharedPreference
     * /data/data/<applicationId>/databases/     用于存储数据库 getDatabasePath（）
     *
     */


}